<html xmlns="https://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Language" content="zh-CN" />
<link href="../style/css/manual-zip.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
<link href="../style/css/manual-zip-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
<link href="../style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" />
<title>mod_cgi － Apache 2.2 中文手册 [金步国]</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head>
<body><div id="page-header">
<p class="menu"><a href="index.html">模块索引</a> | <a href="directives.html">指令索引</a> | <a href="../faq/index.html">常见问题</a> | <a href="../glossary.html">词汇表</a> | <a href="../sitemap.html">站点导航</a></p><p class="apache">Apache HTTP Server 版本2.2</p><img alt="" src="../images/feather.gif" /></div>
<div class="up"><a href="index.html"><img title="&lt;-" alt="&lt;-" src="../images/left.gif" /></a></div>
<div id="path"><a href="https://www.apache.org/">Apache</a> &gt; <a href="https://httpd.apache.org/">HTTP Server</a> &gt; <a href="https://httpd.apache.org/docs/">文档</a> &gt; <a href="../index.html">版本2.2</a> &gt; <a href="index.html">模块</a></div>

<div id="translation-info">　　 <a href="../translator_announcement.html#thanks">致谢</a> | 本篇译者：<a href="../../../index.html">金步国</a>(<a href="../../../index.html">作品集</a>) | 本页最后更新：2006年10月20日</div>
<div id="page-content"><div id="preamble"><h1>Apache模块 mod_cgi</h1>

<table border="1" cellpadding="0" cellspacing="0" bordercolor="#AAAAAA" class="module">
<tr><th><a href="module-dict.html#Description">说明</a></th><td>在非线程型MPM(<code class="module"><a href="prefork.html">prefork</a></code>)上提供对CGI脚本执行的支持</td></tr>
<tr><th><a href="module-dict.html#Status">状态</a></th><td>基本(B)</td></tr>
<tr><th><a href="module-dict.html#ModuleIdentifier">模块名</a></th><td>cgi_module</td></tr>
<tr><th><a href="module-dict.html#SourceFile">源文件</a></th><td>mod_cgi.c</td></tr>
</table>
<h3>概述</h3>



    <p>任何具有MIME类型<code>application/x-httpd-cgi</code>或者被<code>cgi-script</code>处理器处理的文件都将被作为CGI脚本对待并由服务器运行，它的输出将被返回给客户端。可以通过两种途径使文件成为CGI脚本，一种是文件具有已由<code class="directive"><a href="mod_mime.html#addtype">AddType</a></code>指令定义的扩展名，另一种是文件位于<code class="directive"><a href="mod_alias.html#scriptalias">ScriptAlias</a></code>目录中。</p>

    <p>当服务器调用一个CGI脚本时会往运行环境中添加一个叫做<code>DOCUMENT_ROOT</code>的变量。这个变量将包含<code class="directive"><a href="core.html#documentroot">DocumentRoot</a></code>指令的值。</p>

    <p>要得到对Apache中使用CGI脚本的介绍，参看<a href="../howto/cgi.html">使用CGI产生动态内容</a>。</p>

    <p>在UNIX下使用多线程型的MPM时，应该使用模块<code class="module"><a href="mod_cgid.html">mod_cgid</a></code>代替本模块。在用户层面，这两个模块本质上是相同的。</p>
</div>
<div class="top"><a href="mod_cgi.html#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="env" id="env">CGI环境变量</a></h2>
    <p>Apache将按照<a href="http://hoohoo.ncsa.uiuc.edu/cgi/">CGI规范</a>设置环境变量，有以下几个：</p>

    <dl>
      <dt>PATH_INFO</dt>
      <dd>如果显式设置了<code class="directive"><a href="core.html#acceptpathinfo">AcceptPathInfo</a></code>指令为 <code>off</code> ，这个变量将不可用。如果没有明确设置<code class="directive">AcceptPathInfo</code> ，默认的行为是<code class="module"><a href="mod_cgi.html">mod_cgi</a></code>将会接受路径信息(URI里脚本文件名之后的<code>/more/path/info</code>)，即使服务器核心对请求的附加路径信息返回"404 NOT FOUND"错误。省略<code class="directive">AcceptPathInfo</code>指令与将它设置为 <code>On</code> 对<code class="module"><a href="mod_cgi.html">mod_cgi</a></code>请求具有相同的效果。</dd>

      <dt>REMOTE_HOST</dt>

      <dd>这个变量只有在<code class="directive"><a href="core.html#hostnamelookups">HostnameLookups</a></code>指令被设置为"<code>on</code>"(默认是"off")并且对访问主机的DNS反查确实找到了主机名时才被设置。</dd>

      <dt>REMOTE_IDENT</dt>
      <dd>这个变量只有在<code class="directive"><a href="core.html#identitycheck">IdentityCheck</a></code>被设置为 <code>on</code> 并且访问主机支持识别协议时才被设置。注意这个变量不能信赖，因为它很容易被假冒。而且如果客户端与服务器之间存在代理的话，这个变量通常完全没有用处。</dd>

      <dt>REMOTE_USER</dt>
      <dd>这个变量只有当CGI脚本需要身份验证时才被设置。</dd>
    </dl>
</div><div class="top"><a href="mod_cgi.html#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="cgi-debug" id="cgi-debug">CGI脚本的调试</a></h2>
    <p>调试CGI脚本一直以来都很困难，主要是因为在脚本不能正确运行时不可能研究它的输出(stdout和stderr)。这些指令为发生错误时提供了更详细的错误日志。</p>

    <h3>CGI日志文件格式</h3>
      <p>配置好以后，CGI错误日志会记录任何没有正确运行的CGI。每个运行失败的CGI脚本都有几行信息被记录。头两行总是这样的格式：</p>

      <div class="example"><p><code>
        %% [<var>time</var>] <var>request-line</var><br />
        %% <var>HTTP-status</var> <var>CGI-script-filename</var>
      </code></p></div>

      <p>如果错误是CGI脚本无法执行，日志文件会包含以下额外的两行：</p>

      <div class="example"><p><code>
        %%error<br />
        <var>error-message</var>
      </code></p></div>

      <p>或者，如果错误是脚本执行结果返回了不正确的头信息(经常是由于脚本内部的bug)，会记录以下两行：</p>

      <div class="example"><p><code>
        %request<br />
        <var>All HTTP request headers received</var><br />
        <var>POST or PUT entity (if any)</var><br />
        %response<br />
        <var>All headers output by the CGI script</var><br />
        %stdout<br />
        <var>CGI standard output</var><br />
        %stderr<br />
        <var>CGI standard error</var><br />
      </code></p></div>

      <p>如果脚本没有在stdout和stderr上输出可能会没有%stdout和%stderr部分。</p>

</div>
<div class="top"><a href="mod_cgi.html#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="ScriptLog" id="ScriptLog">ScriptLog</a> <a name="scriptlog" id="scriptlog">指令</a></h2>
<table border="1" cellpadding="0" cellspacing="0" bordercolor="#AAAAAA" class="directive">
<tr><th><a href="directive-dict.html#Description">说明</a></th><td>CGI脚本错误日志文件的位置</td></tr>
<tr><th><a href="directive-dict.html#Syntax">语法</a></th><td><code>ScriptLog <var>file-path</var></code></td></tr>
<tr><th><a href="directive-dict.html#Context">作用域</a></th><td>server config, virtual host</td></tr>
<tr><th><a href="directive-dict.html#Status">状态</a></th><td>基本(B)</td></tr>
<tr><th><a href="directive-dict.html#Module">模块</a></th><td><code class="module"><a href="mod_cgi.html">mod_cgi</a></code>, <code class="module"><a href="mod_cgid.html">mod_cgid</a></code></td></tr>
</table>
    <p><code class="directive">ScriptLog</code>指令设置了CGI脚本错误日志文件的位置。如果没有设置<code class="directive">ScriptLog</code> ，就不会创建错误日志。如果设置了，所有CGI错误都会被记入作为指令参数的文件中。如果是一个相对路径则以<code class="directive"><a href="core.html#serverroot">ServerRoot</a></code>为参照。</p>

    <div class="example"><h3>示例</h3><p><code>
      ScriptLog logs/cgi_log
    </code></p></div>

    <p>此日志会以运行子进程的用户身份打开，比如由主服务器配置部分的<code class="directive"><a href="mpm_common.html#user">User</a></code>指令指定的用户。这意味着，或者该用户对脚本日志所在目录具有写权限，或者日志文件由此用户手工创建并设置为可写。如果你把脚本日志放在你的主日志目录中，<strong>不要</strong>为了让运行子进程的用户可以写日志而改变目录的权限。</p>

    <p>注意，脚本日志是为了给创建CGI脚本提供一个调试特性，而不是要在运行服务时持续保持活动状态。它没有为速度或是效率作优化，而且与专门设计的那些特性不同，在某种程度上它会存在安全问题。</p>

</div>
<div class="top"><a href="mod_cgi.html#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="ScriptLogBuffer" id="ScriptLogBuffer">ScriptLogBuffer</a> <a name="scriptlogbuffer" id="scriptlogbuffer">指令</a></h2>
<table border="1" cellpadding="0" cellspacing="0" bordercolor="#AAAAAA" class="directive">
<tr><th><a href="directive-dict.html#Description">说明</a></th><td>记入日志文件的PUT或POST请求头的最大数量</td></tr>
<tr><th><a href="directive-dict.html#Syntax">语法</a></th><td><code>ScriptLogBuffer <var>bytes</var></code></td></tr>
<tr><th><a href="directive-dict.html#Default">默认值</a></th><td><code>ScriptLogBuffer 1024</code></td></tr>
<tr><th><a href="directive-dict.html#Context">作用域</a></th><td>server config, virtual host</td></tr>
<tr><th><a href="directive-dict.html#Status">状态</a></th><td>基本(B)</td></tr>
<tr><th><a href="directive-dict.html#Module">模块</a></th><td><code class="module"><a href="mod_cgi.html">mod_cgi</a></code>, <code class="module"><a href="mod_cgid.html">mod_cgid</a></code></td></tr>
</table>
    <p>限制记入日志文件的PUT或者POST内容的大小，防止如果接收到很大内容时日志文件的尺寸增加得太快太大。默认地，最多纪录1024字节，但这个数字可以用此指令改变。</p>

</div>
<div class="top"><a href="mod_cgi.html#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="ScriptLogLength" id="ScriptLogLength">ScriptLogLength</a> <a name="scriptloglength" id="scriptloglength">指令</a></h2>
<table border="1" cellpadding="0" cellspacing="0" bordercolor="#AAAAAA" class="directive">
<tr><th><a href="directive-dict.html#Description">说明</a></th><td>日志文件的大小限制(字节)</td></tr>
<tr><th><a href="directive-dict.html#Syntax">语法</a></th><td><code>ScriptLogLength <var>bytes</var></code></td></tr>
<tr><th><a href="directive-dict.html#Default">默认值</a></th><td><code>ScriptLogLength 10385760</code></td></tr>
<tr><th><a href="directive-dict.html#Context">作用域</a></th><td>server config, virtual host</td></tr>
<tr><th><a href="directive-dict.html#Status">状态</a></th><td>基本(B)</td></tr>
<tr><th><a href="directive-dict.html#Module">模块</a></th><td><code class="module"><a href="mod_cgi.html">mod_cgi</a></code>, <code class="module"><a href="mod_cgid.html">mod_cgid</a></code></td></tr>
</table>
    <p><code class="directive">ScriptLogLength</code>指令可以用于限制CGI脚本文件的大小。由于日志文件对每个CGI错误纪录(所有请求头、所有脚本输出)许多信息，它有可能会变成一个很大的文件。为了防止无限制的增长引起的问题，这个指令可以用来给CGI日志文件的大小设置一个上限。如果文件大小达到了这个限制，就不会再有信息被写入日志。</p>

</div>
</div>
<div id="footer">
<p class="apache">本文允许自由的转载、引用、再分发，但必须保留译者署名并注明出处；详见：<a href="../translator_announcement.html#announcement">版权声明</a>。</p>
<p class="menu"><a href="index.html">模块索引</a> | <a href="directives.html">指令索引</a> | <a href="../faq/index.html">常见问题</a> | <a href="../glossary.html">词汇表</a> | <a href="../sitemap.html">站点导航</a></p></div>
</body></html>
